package a10_动态规划;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * a26_单词拆分
 * </p>
 *
 * @author flyduck
 * @since 2025/2/18
 */
public class a26_单词拆分 {

    public static void main(String[] args) {
        List<String> wordDict = new ArrayList<>();
        wordDict.add("apple");
        wordDict.add("pen");
        boolean catsandog = wordBreak("applepenapple", wordDict);
        System.out.println(catsandog);
    }
    //反过来想：这些字典能不能组成字符串
    //字典里面的元素可以使用多次，所以是完全背包的问题
    //非经典：先物品是组合，先重量是排列  但好像没事，这里求的是能不能组成，老师说必须先重量

    //dp[j]：长度为j的字符串能否被拼成的值dp[j]

    //递推公式：
    //如果i到j刚好出现在我们的单词里面，并且dp[i] == true，那么dp[j] = true

    //初始化：dp[0] = true（如果为false，就全是false了）
    public static boolean wordBreak(String s, List<String> wordDict) {
        char[] chars = s.toCharArray();
        boolean[] dp = new boolean[s.length()+1];
        dp[0] = true;

        for (int j = 1; j <= s.length(); j++) {//长度
            for (int i = 0; i <= j; i++) {//物品
                String splitStr = splitStr(chars, i, j - 1);
                if (wordDict.contains(splitStr) && dp[i] == true) {
                    dp[j] = true;
                }
            }
        }
        return dp[s.length()];

    }

//    public static boolean wordBreak(String s, List<String> wordDict) {
//        char[] chars = s.toCharArray();
//        boolean[] dp = new boolean[s.length()+1];
//        dp[0] = true;
//
//        for (int j = 0; j <= s.length(); j++) {//长度
//            for (int i = 0; i < wordDict.size(); i++) {
//                if(j >= wordDict.get(i).length()){//注意：j为字符串的长度
//                    //如何截取：比如字符串为aabccd   ccd 6 3
//                    //那么就应该截取： [3,5]  [j-wordDict.get(i).length(),j-1]
//                    String splitStr = splitStr(chars, j - wordDict.get(i).length(), j-1);
//                    if(dp[j-wordDict.get(i).length()] == true && splitStr.equals(wordDict.get(i))){
//                        dp[j] = true;
//                    }
//                }
//
//            }
//        }
//        return dp[s.length()];
//
//    }

    private static String splitStr(char[] chars,int leftIdx,int rightIdx){
        System.out.println("leftIdx = " + leftIdx);
        System.out.println("rightIdx = " + rightIdx);

        char[] result = new char[rightIdx - leftIdx + 1];
        int currentIdx = 0;
        while (leftIdx <= rightIdx) {
            result[currentIdx] = chars[leftIdx];
            leftIdx++;
            currentIdx++;
        }
        return new String(result);
    }
}
